Skip to content

fix: include parent span IDs in daemon merge writes - #52

Merged
max-braintrust merged 2 commits into
mainfrom
fix/codex-parent-identity
Sep 22, 2026
Merged

max-braintrust merged 2 commits into
mainfrom
fix/codex-parent-identity

Conversation

@max-braintrust

@max-braintrust max-braintrust commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Issue

Merge writes from the plugins did not include parent ids. This was a problem if no successful insert write proceeded the merge write for a particular span, because the span would be attached to the trace without a parent. Spans without parents automatically get is_root=true, so this can lead to a situation where a trace has multiple spans marked as the root.

Solution

Include the correct root_span_id and parent span IDs in every merge write, using the same deterministic hierarchy used by the corresponding insert. This allows a merge to preserve the span’s hierarchy even when the initial insert was not persisted, without requiring a sink-side identity cache.

Add regression coverage to verify that:

  • Every merge carries the same trace and parent identity as its insert.
  • Stateless updates for closed spans include their parent IDs.

@max-braintrust max-braintrust changed the title fix: daemon merge writes should include parent span ids fix: include parent span IDs in Codex daemon merge writes Sep 4, 2026
@max-braintrust
max-braintrust force-pushed the fix/codex-parent-identity branch from 12b9682 to a7d40f2 Compare September 4, 2026 23:46
@max-braintrust max-braintrust changed the title fix: include parent span IDs in Codex daemon merge writes fix: include parent span IDs in daemon merge writes Sep 4, 2026
@Qard

Copy link
Copy Markdown
Collaborator

max-braintrust Looks like there are a bunch of conflicts. Can you rebase this?

@max-braintrust
max-braintrust force-pushed the fix/codex-parent-identity branch 2 times, most recently from 571936b to 11300ce Compare September 22, 2026 20:03
max-braintrust and others added 2 commits September 22, 2026 21:02
Closes three gaps left by the previous commit, each covered by a test that
fails without the fix:

- opencode: the `session.idle` root merge dropped the parent. Idle runs after
  every turn; only the sibling close-root arm had been converted.
- codex: `update_open_main_root_source` dropped the external parent. Every
  main-scope Stop closes the root handle, so a later SessionStart
  (resume/compact) merges statelessly in the same live session.
- grok: the translator had been skipped entirely. All 13 merge sites now carry
  parents, with the owning span id recorded on OpenLlm/OpenTool/CompletedTool
  and the attached parent on the session row. Two of these carry a
  late_merge_key, meaning the merge is expected after the terminal row.

Coverage:
- Wire codex's reduce() and grok's whole suite to the invariant. Grok is the
  only suite without a reduce() choke point, so merges are checked per batch
  against an IdentityLedger that remembers inserts across hooks.
- Grok's suite never built a SessionCtx with a config, so the attached-parent
  path was untested; add a test that asserts every session-row merge repeats
  the external parent.

Without the grok fix, 16 of 19 grok tests now fail.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@max-braintrust
max-braintrust force-pushed the fix/codex-parent-identity branch from 11300ce to 36bc8be Compare September 22, 2026 21:04
@max-braintrust
max-braintrust merged commit 422810e into main Sep 22, 2026
20 checks passed
@max-braintrust
max-braintrust deleted the fix/codex-parent-identity branch September 22, 2026 23:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants